package _case

import "fmt"

// 算数运算
func ArithmeticCase() {
	var a = 10
	var b = 20
	var c int

	c = a + b
	fmt.Println("a + b = ", c)
	c = a - b
	fmt.Println("a - b = ", c)
	c = a * b
	fmt.Println("a * b = ", c)
	c = a / b
	fmt.Println("a / b = ", c)
	c = a % b
	fmt.Println("a % b = ", c)
	a++
	fmt.Println("a++ = ", a)
	b--
	fmt.Println("b-- = ", b)
}

// 关系运算
func RelationCase() {
	var a = 10
	var b = 20
	fmt.Println("a == b", a == b)
	fmt.Println("a >= b", a >= b)
	fmt.Println("a > b", a > b)
	fmt.Println("a <= b", a <= b)
	fmt.Println("a < b", a < b)
	fmt.Println("a != b", a != b)
}

// 逻辑运算
func LogicCase() {
	var a = true
	var b = false
	fmt.Println("a && b", a && b)
	fmt.Println("a || b", a || b)
	fmt.Println("!(a && b)", !(a && b))
}

// 位运算
func BitCase() {
	var a uint8 = 60
	var b uint8 = 13
	var c uint8 = 0
	fmt.Printf("%08b\n", a)
	fmt.Printf("%08b\n", b)
	fmt.Printf("%08b\n", c)

	//按位与(&&)：两个位都为 1，结果才为 1；否则为 0
	fmt.Printf("a & b=%08b\n", a&b)
	//按位或(||)：只要有一个位为 1，结果为 1
	fmt.Printf("a | b=%08b\n", a|b)
	//按位异或：两个位相同为 0，不同为 1
	fmt.Printf("a ^ b=%08b\n", a^b)
	//左移：将二进制位向左移动指定位数，右侧补 0
	fmt.Printf("a << 2=%08b\n", a<<2)
	//右移：将二进制位向右移动指定位数，左侧补 0（对于无符号数）
	fmt.Printf("a >> 2=%08b\n", a>>2)
	//取反：0取1,1取0
	fmt.Printf("^a=%08b\n", ^a)
	//按位清零（AND NOT）：如果某个位在第二个操作数中为 1，则清零；否则保留原值
	//b取反，再 a && b

	//如果 b 的某个位是 1，对应的 a 位会被清零（即变为 0）
	//如果 b 的某个位是 0，对应的 a 位保持不变
	//a = 00111100
	//b = 00001101
	//--------------
	//a &^ b = 00110000

	fmt.Printf("a &^ b=%08b\n", a&^b)
}

// 赋值运算
func AssignmentCase() {
	var a = 10
	var c = 10
	c += a
	fmt.Println("c += ", c)
	c -= a
	fmt.Println("c -= ", c)
	c *= a
	fmt.Println("c *= ", c)
	c /= a
	fmt.Println("c /= ", c)
	c %= a
	fmt.Println("c %= ", c)

	var b uint8 = 60
	fmt.Printf("b的值为：%08b\n", b)
	fmt.Printf("2的值为：%08b\n", 2)
	b <<= 2
	fmt.Printf("b <<= 2 b 值为 %d 二进制表示：%08b\n", b, b)
	b >>= 2
	fmt.Printf("b >>= 2 b 值为 %d 二进制表示：%08b\n", b, b)
	b &= 2
	fmt.Printf("b &= 2 b 值为 %d 二进制表示：%08b\n", b, b)
	b ^= 2
	fmt.Printf("b ^= 2 b 值为 %d 二进制表示：%08b\n", b, b)
	b |= 2
	fmt.Printf("b |= 2 b 值为 %d 二进制表示：%08b\n", b, b)
}
